//package com.kobeliu.api.config;
//
//import com.kobeliu.exceptions.GraceException;
//import com.kobeliu.result.ResponseStatusEnum;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
////import org.apache.zookeeper.*;
////import org.apache.zookeeper.data.Stat;
//
//import java.util.Collections;
//import java.util.List;
//import java.util.concurrent.CountDownLatch;
//
//@Slf4j
//public class ZkLock {
//
//    private ZooKeeper zooKeeper;
//    private String lockName;
//
//    private String selLock = null;
//    private static String lockSpace = "locks";
//
//    private CountDownLatch waitToGetLatch = new CountDownLatch(1);
//
//    public ZkLock(ZooKeeper zooKeeper,String lockName) throws InterruptedException, KeeperException {
//        this.zooKeeper = zooKeeper;
//        this.lockName = lockName;
//
//        /**
//         * 创建的同时初始化分布式锁的命名空间
//         */
//        Stat s = zooKeeper.exists(lockSpace, false);
//        if(s == null){
//            //创建
//            //创建的锁根节点是永久节点
//            zooKeeper.create(lockSpace,"this is zk lock space".getBytes(),
//                    ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//        }
//
//
//
//
//    }
//
//
//    public void get() throws InterruptedException, KeeperException {
//        //创建锁 临时有序节点
//
//        //返回当前的/loanSpace/lockName00n
//        selLock = zooKeeper.create(lockSpace + "/" + lockName, "this is zk lock space".getBytes(),
//                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
//
//        log.info("{}创建完毕，进入判断流程",selLock);
//
//        //判断当前节点是不是第0个位置，如果是则表明当前请求可以获得锁，若上一个节点还存在，则不处于第0个位置，则需要等待
//        List<String> subLocks = zooKeeper.getChildren(lockSpace, false);
//        if(subLocks == null){
//            //报错
//            GraceException.display(ResponseStatusEnum.SYSTEM_ERROR);
//        }
//        if(subLocks.size() == 1){
//            //可以获得锁
//            return;
//        }else{
//            String shortIndex = StringUtils.substringAfterLast(selLock,"/");
//            //获取当前节点的下标
//            Integer selfIndex = Collections.binarySearch(subLocks, shortIndex);
//
//            if(selfIndex == -1 ){
//                //没截取到
//                //报错
//                GraceException.display(ResponseStatusEnum.SYSTEM_ERROR);
//            }else if(selfIndex >0){
//                String beforeLock = subLocks.get(selfIndex-1);
//                //监听上一个节点
//                zooKeeper.getData(lockSpace+"/"+beforeLock, watchedEvent -> {
//                    if(watchedEvent.getType() == Watcher.Event.EventType.NodeDeleted){
//                        log.info("前锁已经被释放");
//
//                        waitToGetLatch.countDown();
//                    }
//                },null);
//
//                //阻塞等待
//                waitToGetLatch.await();
//
//                return;
//            }else if(selfIndex == 0){
//                //可以获得锁
//                return;
//            }
//        }
//
//
//    }
//
//    public void release(){
//
//        //释放锁
//        try {
//            zooKeeper.delete(selLock,-1);
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        } catch (KeeperException e) {
//            throw new RuntimeException(e);
//        }
//    }
//}
